1
การจัดการการเติบโตของคอนเทนเนอร์: ขนาดกับความจุ
AI037Lesson 14
00:00

ในภาษา C++ การจัดการการเติบโตของคอนเทนเนอร์เป็นเหมือนการเต้นรำทางสถาปัตยกรรมระหว่าง ขนาด (องค์ประกอบปัจจุบัน) กับ ความจุ (หน่วยความจำที่สำรองไว้) สำหรับคอนเทนเนอร์แบบต่อเนื่อง เช่น vector และ stringเมื่อถึงขีดจำกัดความจุจะเรียกใช้การ การจัดสรรใหม่: ระบบจะหาบล็อกหน่วยความจำที่ใหญ่ขึ้น ย้ายองค์ประกอบทั้งหมด และทำลายบล็อกเดิม ซึ่งเป็นกระบวนการที่มีต้นทุนสูง $O(n)$ ทำให้เกิดการไม่ถูกต้องของตัวชี้ (iterator invalidation) การไม่ถูกต้องของตัวชี้— ตัวชี้ของคุณไปยังองค์ประกอบเดิมจะกลายเป็นตัวชี้ที่ลอย (dangling) และอันตราย

1. กลยุทธ์การขยายตัว

เพื่อหลีกเลี่ยงการจัดสรรใหม่บ่อยครั้ง vector การประยุกต์ใช้งานจะจัดสรรพื้นที่สำรอง (buffer) คำสั่ง c.reserve(n) กำหนดความจุขั้นต่ำโดยไม่เพิ่มองค์ประกอบ ขณะที่ c.shrink_to_fit() เป็นคำขอที่ไม่บังคับให้คืนหน่วยความจำที่เหลือให้กับระบบปฏิบัติการ

2. ความแตกต่างระหว่างการเปลี่ยนขนาดกับการจอง

แม้ว่า reserve จะส่งผลเฉพาะต่อพื้นที่สำรอง resize(n) จะเปลี่ยนแปลงตรรกะของคอนเทนเนอร์อย่างกระตือรือร้น การลดขนาดผ่าน resize จะทำลายองค์ประกอบ ในขณะที่การขยายจะเพิ่มค่าเริ่มต้นตามค่าเริ่มต้น

ขนาด (ที่ใช้แล้ว)ความจุเพิ่มเติมความจุรวม
⚠️ คำเตือน: หาก resize ลดขนาดคอนเทนเนอร์ ตัวชี้ที่ชี้ไปยังองค์ประกอบที่ถูกลบจะไม่ถูกต้อง หากการขยายทำให้เกิดการจัดสรรใหม่ ทุกตัว ตัวชี้ทั้งหมดจะไม่ถูกต้อง
main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>